/*
Copyright 2024 New Vector Ltd.
Copyright 2017 Vector Creations Ltd
Copyright 2016 OpenMarket Ltd

SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
 */

#import "TableViewCellWithCheckBoxes.h"

#import "GeneratedInterface-Swift.h"

// The space between 2 check boxes
#define TABLEVIEWCELLWITHCHECKBOXES_MARGIN 8

@interface TableViewCellWithCheckBoxes ()
{
    NSMutableArray *checkBoxesArray;
    NSMutableArray *labelArray;
}
@end

@implementation TableViewCellWithCheckBoxes

- (void)setCheckBoxesNumber:(NSUInteger)checkBoxesNumber
{
    if (_checkBoxesNumber == checkBoxesNumber)
    {
        return;
    }
    
    // Remove existing items
    NSArray *subviews = self.mainContainer.subviews;
    for (UIView *view in subviews)
    {
        [view removeFromSuperview];
    }
    
    _checkBoxesNumber = checkBoxesNumber;
    
    if (!_checkBoxesNumber)
    {
        // Nothing to do
        return;
    }
    
    checkBoxesArray = [NSMutableArray arrayWithCapacity:checkBoxesNumber];
    labelArray = [NSMutableArray arrayWithCapacity:checkBoxesNumber];
    
    CGFloat containerWidth = (self.mainContainer.frame.size.width - ((checkBoxesNumber - 1.0) * TABLEVIEWCELLWITHCHECKBOXES_MARGIN)) / checkBoxesNumber;
    
    UIView *previousContainer = nil;
    NSLayoutConstraint *topConstraint, *leftConstraint, *bottomConstraint;
    NSLayoutConstraint *widthConstraint, *heightConstraint, *centerYConstraint, *centerXConstraint;
    
    for (NSInteger index = 0; index < checkBoxesNumber; index++)
    {
        UIView *checkboxContainer = [[UIView alloc] initWithFrame:CGRectMake(index * (containerWidth + TABLEVIEWCELLWITHCHECKBOXES_MARGIN), 0, containerWidth, self.mainContainer.frame.size.height)];
        checkboxContainer.backgroundColor = [UIColor clearColor];
        [self.mainContainer addSubview:checkboxContainer];
        
        // Add container constraints
        checkboxContainer.translatesAutoresizingMaskIntoConstraints = NO;
        if (!previousContainer)
        {
            leftConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
                                                          attribute:NSLayoutAttributeLeading
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.mainContainer
                                                          attribute:NSLayoutAttributeLeading
                                                         multiplier:1
                                                           constant:0];
            widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
                                                           attribute:NSLayoutAttributeWidth
                                                           relatedBy:NSLayoutRelationEqual
                                                              toItem:self.mainContainer
                                                           attribute:NSLayoutAttributeWidth
                                                          multiplier:(1.0 / checkBoxesNumber)
                                                            constant:(- ((checkBoxesNumber - 1.0) * TABLEVIEWCELLWITHCHECKBOXES_MARGIN) / checkBoxesNumber)];
        }
        else
        {
            leftConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
                                                          attribute:NSLayoutAttributeLeading
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:previousContainer
                                                          attribute:NSLayoutAttributeTrailing
                                                         multiplier:1
                                                           constant:TABLEVIEWCELLWITHCHECKBOXES_MARGIN];
            widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
                                                           attribute:NSLayoutAttributeWidth
                                                           relatedBy:NSLayoutRelationEqual
                                                              toItem:previousContainer
                                                           attribute:NSLayoutAttributeWidth
                                                          multiplier:1
                                                            constant:0];
        }
        
        topConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
                                                        attribute:NSLayoutAttributeTop
                                                        relatedBy:NSLayoutRelationEqual
                                                           toItem:self.mainContainer
                                                        attribute:NSLayoutAttributeTop
                                                       multiplier:1
                                                         constant:0];
        
        bottomConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
                                                         attribute:NSLayoutAttributeBottom
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:self.mainContainer
                                                         attribute:NSLayoutAttributeBottom
                                                        multiplier:1
                                                          constant:0];
        
        [NSLayoutConstraint activateConstraints:@[leftConstraint, widthConstraint, topConstraint, bottomConstraint]];
        
        previousContainer = checkboxContainer;
        
        // Add Checkbox and Label
        UIImageView *checkbox = [[UIImageView alloc] initWithFrame:CGRectMake(14, 11, 22, 22)];
        checkbox.translatesAutoresizingMaskIntoConstraints = NO;
        [checkboxContainer addSubview:checkbox];
        
        // Store the new check box unselected by default
        checkbox.image = AssetImages.selectionUntick.image;
        checkbox.tintColor = ThemeService.shared.theme.tintColor;
        checkbox.tag = 0;
        [checkBoxesArray addObject:checkbox];
        
        UILabel *theLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, containerWidth - 60, 31)];
        theLabel.translatesAutoresizingMaskIntoConstraints = NO;
        [checkboxContainer addSubview:theLabel];
        [labelArray addObject:theLabel];
        
        UIView *checkboxMask = [[UIView alloc] initWithFrame:CGRectMake(7, 4, 36, 36)];
        checkboxMask.translatesAutoresizingMaskIntoConstraints = NO;
        [checkboxContainer addSubview:checkboxMask];
        // Listen to check box tap
        checkboxMask.tag = index;
        checkboxMask.userInteractionEnabled = YES;
        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onCheckBoxTap:)];
        [tapGesture setNumberOfTouchesRequired:1];
        [tapGesture setNumberOfTapsRequired:1];
        [tapGesture setDelegate:self];
        [checkboxMask addGestureRecognizer:tapGesture];
        
        // Add switch constraints
        leftConstraint = [NSLayoutConstraint constraintWithItem:checkbox
                                                     attribute:NSLayoutAttributeLeading
                                                     relatedBy:NSLayoutRelationEqual
                                                        toItem:checkboxContainer
                                                     attribute:NSLayoutAttributeLeading
                                                    multiplier:1
                                                      constant:14];
        
        widthConstraint = [NSLayoutConstraint constraintWithItem:checkbox
                                                       attribute:NSLayoutAttributeWidth
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:nil
                                                       attribute:NSLayoutAttributeNotAnAttribute
                                                      multiplier:1
                                                        constant:22];
        
        centerYConstraint = [NSLayoutConstraint constraintWithItem:checkbox
                                                         attribute:NSLayoutAttributeCenterY
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:checkboxContainer
                                                         attribute:NSLayoutAttributeCenterY
                                                        multiplier:1
                                                          constant:0.0f];
        
        [NSLayoutConstraint activateConstraints:@[leftConstraint, widthConstraint, centerYConstraint]];
        
        
        // Add Label constraints
        topConstraint = [NSLayoutConstraint constraintWithItem:theLabel
                                                     attribute:NSLayoutAttributeTop
                                                     relatedBy:NSLayoutRelationEqual
                                                        toItem:checkboxContainer
                                                     attribute:NSLayoutAttributeTop
                                                    multiplier:1
                                                      constant:0];
        
        leftConstraint = [NSLayoutConstraint constraintWithItem:theLabel
                                                      attribute:NSLayoutAttributeLeading
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:checkbox
                                                      attribute:NSLayoutAttributeTrailing
                                                     multiplier:1
                                                       constant:9];
        
        centerYConstraint = [NSLayoutConstraint constraintWithItem:theLabel
                                                         attribute:NSLayoutAttributeCenterY
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:checkboxContainer
                                                         attribute:NSLayoutAttributeCenterY
                                                        multiplier:1
                                                          constant:0.0f];
        
        [NSLayoutConstraint activateConstraints:@[topConstraint, leftConstraint, centerYConstraint]];
        
        // Add check box mask constraints
        widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
                                                       attribute:NSLayoutAttributeWidth
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:nil
                                                       attribute:NSLayoutAttributeNotAnAttribute
                                                      multiplier:1
                                                        constant:36];
        
        heightConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
                                                       attribute:NSLayoutAttributeHeight
                                                       relatedBy:NSLayoutRelationEqual
                                                          toItem:nil
                                                       attribute:NSLayoutAttributeNotAnAttribute
                                                      multiplier:1
                                                        constant:36];
        
        centerXConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
                                                         attribute:NSLayoutAttributeCenterX
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:checkbox
                                                         attribute:NSLayoutAttributeCenterX
                                                        multiplier:1
                                                          constant:0.0f];
        
        centerYConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
                                                         attribute:NSLayoutAttributeCenterY
                                                         relatedBy:NSLayoutRelationEqual
                                                            toItem:checkbox
                                                         attribute:NSLayoutAttributeCenterY
                                                        multiplier:1
                                                          constant:0.0f];
        
        [NSLayoutConstraint activateConstraints:@[widthConstraint, heightConstraint, centerXConstraint, centerYConstraint]];
    }
}

- (NSArray*)checkBoxes
{
    return [NSArray arrayWithArray:checkBoxesArray];
}

- (NSArray*)labels
{
    return [NSArray arrayWithArray:labelArray];
}

- (void)setCheckBoxValue:(BOOL)isSelected atIndex:(NSUInteger)index
{
    if (index < checkBoxesArray.count)
    {
        UIImageView *checkBox = checkBoxesArray[index];
        
        if (isSelected && !checkBox.tag)
        {
            checkBox.image = AssetImages.selectionTick.image;
            checkBox.tag = 1;
            
            if (!self.allowsMultipleSelection)
            {
                // Unselect others check boxes
                for (NSUInteger k = 0; k < checkBoxesArray.count; k++)
                {
                    if (k != index)
                    {
                        checkBox = checkBoxesArray[k];
                        if (checkBox.tag)
                        {
                            checkBox.image = AssetImages.selectionUntick.image;
                            checkBox.tag = 0;
                        }
                    }
                }
            }
        }
        else if (!isSelected && checkBox.tag)
        {
            checkBox.image = AssetImages.selectionUntick.image;
            checkBox.tag = 0;
        }
    }
}

- (BOOL)checkBoxValueAtIndex:(NSUInteger)index
{
    if (index < checkBoxesArray.count)
    {
        UIImageView *checkBox = checkBoxesArray[index];
        
        return ((BOOL)checkBox.tag);
    }
    
    return NO;
}

#pragma mark - Action

- (IBAction)onCheckBoxTap:(UITapGestureRecognizer*)sender
{
    if (_delegate)
    {
        [_delegate tableViewCellWithCheckBoxes:self didTapOnCheckBoxAtIndex:sender.view.tag];
    }
}
@end

